package com.xxjh.brs.sftp.service.impl;

import cn.hutool.extra.ssh.Sftp;
import com.xxjh.brs.ftp.common.api.enums.ResponseStatus;
import com.xxjh.brs.ftp.common.exceptions.ConditionException;
import com.xxjh.brs.sftp.service.AbstractSftpService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.ObjectPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.List;

/**
 * @author CHENCHEN
 * @title a
 * @company 新兴际华科技（天津）有限公司
 * @create 2024-07-04 16:03
 */
@Slf4j
@Service
public class PullSftpService extends AbstractSftpService {


    @Autowired
    @Qualifier("sftpClientPoolPull")
    private ObjectPool<Sftp> sftpClientPoolPull;

    @Value("${sftp.pullServer.root}")
    protected String rootPath;

    @Override
    protected ObjectPool<Sftp> getSftpClientPool() {
        return sftpClientPoolPull;
    }

    /**
     * 通过FTP下载文件到本地。
     *
     * @param drictoryPath 指定根目录下的目录。
     * @param specifiedLayer 有值代表指定目录，无值检索全部。
     * @param existKey 已经完成任务检索的跳过。
     *
     */
    public void downloadPullFtp(String drictoryPath, String specifiedLayer, List<String> existKey){
        Sftp sftpClient = null;
        try {
            sftpClient = getSFTPClient(rootPath);
            downloadSftp(drictoryPath, specifiedLayer, existKey);
        }catch (IOException e) {
            throw new ConditionException(ResponseStatus.FTP_DOWNLOADING_EXCEPTION);
        }finally {
            try {
                sftpClientPoolPull.returnObject(sftpClient);
            } catch (Exception e) {
                log.info("回收连接异常....");
            }
        }
    }

    /**
     * 删除FTP服务器指定目录及其所有内容（包括子目录和文件）。
     *
     * @param directoryPath 要删除的目录的完整路径。
     * @return 如果目录及其内容成功删除则返回true，否则返回false。
     */
    public boolean deleteFtpDirectory(String directoryPath){
        Sftp sftpClient = null;
        try {
            sftpClient = getSFTPClient(rootPath);
            return delDirAndFile(sftpParentPath + directoryPath);
        }finally {
            try {
                sftpClientPoolPull.returnObject(sftpClient);
            } catch (Exception e) {
                log.info("回收连接异常....");
            }
        }
    }
}
